package com.archerdu.base.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;

/**
 * DAO层通用接口定义
 * 
 * @projectName springDemo
 * @description DAO层通用接口定义
 * @author archer du
 * @createDate 2013年9月27日 下午5:27:23
 * @updateUser dxf
 * @updateDate 2013年9月27日 下午5:27:23
 * @updateRemark 新建
 * @version 0.0.1
 */
public interface IBaseDao<E extends BaseEntity<K>, K extends Serializable> extends Serializable {

    /**
     * 父类id，实体对象中的属性
     */
    String PARENT_ID = "parentId";

    /**
     * 取得的对象的类
     * 
     * @return
     */
    public Class<E> getEntityClass();

    /**
     * 保存对象
     * 
     * @param entity
     */
    public void save(E entity);

    /**
     * 保存实现了TreeNode接口的对象
     * 
     * @param entity
     */
    public void save(TreeNode<E, K> entity);

    /**
     * 更新对象
     * 
     * @param entity
     */
    public void merge(E entity);

    /**
     * 更新实现了TreeNode接口的对象
     * 
     * @param entity
     */
    void merge(TreeNode<E, K> entity);

    /**
     * 删除对象
     * 
     * @param entity
     */
    public void delete(E entity);

    /**
     * 根据键值删除对象
     * 
     * @param key
     */
    public void deleteByKey(K key);

    /**
     * 更新对象
     * 
     * @param entity
     */
    public void update(E entity);

    /**
     * 通过parentId查找对象集
     * 
     * @param key
     * @return
     */
    public List<E> findByParentId(K key);

    /**
     * 创建Criteria对象
     * 
     * @return
     */
    public DetachedCriteria getCriteria();

    /**
     * 通过创建Cretira对象查找对象集
     * 
     * @param key
     * @return
     */
    public List<E> findByCretira(DetachedCriteria criteria);

    /**
     * 条件分页查询
     * 
     * @param pageSize
     *            每页条数
     * @param pageNo
     *            页数
     * @return
     */
    public IPage<E> pageSearch(DetachedCriteria criteria, int pageNo, int pageSize);

    /**
     * 条件分页查询
     * 
     * @param pageSize
     *            每页条数
     * @param pageNo
     *            页数
     * @return
     */
    public IPage<E> pageSearch(E entity, int pageNo, int pageSize);

    /**
     * 分页查询
     * 
     * @param pageSize
     *            每页条数
     * @param pageNo
     *            页数
     * @return
     */
    public IPage<E> pageSearch(int pageNo, int pageSize);

    /**
     * 获取对象
     * 
     * @param key
     * @return
     */
    public E get(K key);

    /**
     * 取得全部对象
     * 
     * @return
     */
    public List<E> findAll();

    /**
     * 获取对象集合
     */
    public List<E> findAll(E entity);

    /**
     * 获取对象集合
     */
    public List<E> findAll(E entity, Order order);

    /**
     * 获取对象集合
     */
    public List<E> findAll(E entity, List<Order> orderList);

    /**
     * 获取对象集合
     */
    public List<E> findAll(DetachedCriteria criteria);

}
